﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public static class GlobalConst
{
    public const float AbsoluteZero = -273.15f;
    public const float MaxTemperature = 10000000.0f;
    public const float MinTemperature = -300.0f;    // 这个只是计算用的 用来生成热力学折线方程
    public const float BrownianMovement = 0.2f;                                         //布朗运动 每秒相邻的可交换的格子之间会 交换的气体数量
    public const float BrownianMovementTemperature = 0.002f;                            //温度对布朗运动的加值 温度越高 布朗运动越强烈
    public const float BrownianMovementByDensity = 0.001f;                                //密度对布朗运动的影响 密度低的向上/或者向下传递的时候会有个额外的值  当前（平均密度 - 气体密度）/ 平均密度 * BrownianMovementByDensity
    
    /// <summary>
    /// 标准大气压 单位为KPa
    /// </summary>
    public const float StandardPressure = 101.325f;

    /// <summary>
    /// 标准大气压下 零度下 1立方米的氢气的质量  单位Kg
    /// </summary>
    public const float PressureHydrogenium = 0.0899f;

    /// <summary>
    /// 根据 气体的质量, 分子量,温度,体积 计算压强
    /// </summary>
    /// <returns></returns>
    public static float GetPressure(float mass, float AtomicWeight, float Temperature, float Volume)
    {
        return (mass / PressureHydrogenium) * (2.0f / AtomicWeight) * ((Temperature - AbsoluteZero) / (-AbsoluteZero)) / Volume * StandardPressure;
    }

    /// <summary>
    /// 通过 气体压强 温度 分子量 来计算密度
    /// </summary>
    /// <param name="AtomicWeight"></param>
    /// <param name="Temperature"></param>
    /// <param name="Pressure"></param>
    /// <returns></returns>
    public static float GetGasDensity(float AtomicWeight,float Temperature,float Pressure)
    {
        return PressureHydrogenium * (AtomicWeight / 2.0f) * (Pressure / StandardPressure) * (-AbsoluteZero) / (Temperature - AbsoluteZero); 
    }

    /// <summary>
    /// 根据 其他的 气压 温度 体积 分子量 计算质量
    /// </summary>
    /// <returns></returns>

    public static float GetMassByGasPressure(float gasPressure, float AtomicWeight, float Temperature, float Volume)
    {
        return (gasPressure / StandardPressure) * (PressureHydrogenium * AtomicWeight / 2.0f) * (-AbsoluteZero) / ((Temperature - AbsoluteZero)) * Volume;
    }

    /// <summary>
    /// 得到指定温度下 饱和湿度  单位 KG/立方米
    /// </summary>
    /// <returns></returns>
    public static float GetAbsoluteShidu(float Temperature)
    {
        //公式来源  https://baike.baidu.com/item/%E9%A5%B1%E5%92%8C%E6%B0%B4%E6%B1%BD%E5%8E%8B/8967545
        //计算出来的单位为 hpa 乘上 * 0.1f 转换为kpa 为我们系统中的标准气压单位
        float baoheshuiqiya = 6.112f * (float)Math.Pow(Math.E, (17.67f * Temperature / (Temperature + 243.5f))) * 0.1f;
        return GetMassByGasPressure(baoheshuiqiya, 18, Temperature, 1.0f);      //返回的是 kg/立方米 ;
    }
}
